/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import dominio.Accion;
import dominio.Cliente;
import java.io.FileWriter;
import java.util.*;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

/**
 *
 * @author DaKaLu
 */
public class ManejoXml implements PersistenciaXML {

    private String entrada;
    private String salida;

    public ManejoXml() {
        entrada = "archivos/XML/accionesGuardadas.xml";
        salida = "archivos/XML/accionesNuevas.xml";
    }

    public ManejoXml(String entrada, String salida) {
        this.entrada = entrada;
        this.salida = salida;
    }

    public synchronized List<Accion> leerAcciones() {
        List<Accion> accionesPorEnviar = null;
        SAXBuilder builder = new SAXBuilder(false);
        Document doc = null;
        try {
            doc = builder.build(getEntrada());
        } catch (Exception e) {
            System.out.println("ERROR: " + e.getMessage());
        }

        if (doc != null) {
            accionesPorEnviar = new ArrayList<Accion>();
            List<Element> contenido = doc.getRootElement().getChildren();
            for (Element e : contenido){
                accionesPorEnviar.add(new Accion(
                        e.getChild("Symbol").getText(),
                        e.getChild("Last").getText(),
                        e.getChild("Date").getText(),
                        e.getChild("Time").getText(),
                        e.getChild("Name").getText(),
                        e.getChild("Cantidad").getText()));
            }
        } else {
            System.out.println("Problemas cargando el xml de acciones");
            accionesPorEnviar = null;
        }
        return accionesPorEnviar;
    }

     public synchronized List<Accion> leerAccionesCliente(Element d) {
        List<Accion> accionesPorEnviar = null;

            d = d.getChild("StockQuotes");
            List<Element> stock = d.getChildren();
            for (Element e : stock){
                accionesPorEnviar = new ArrayList<Accion>();
                accionesPorEnviar.add (new Accion(
                e.getChild("Symbol").getText(),
                e.getChild("Last").getText(),
                e.getChild("Date").getText(),
                e.getChild("Time").getText(),
                e.getChild("Name").getText(),
                e.getChild("Cantidad").getText()));
                
            }
            return accionesPorEnviar;
     }

    public synchronized List<Cliente> leerCliente() {
        List<Cliente> listaClientes = null;
        SAXBuilder builder = new SAXBuilder(true);
        Document doc = null;
        boolean flag;
        try {
            doc = builder.build("archivos/XML/cliente.xml");//AQUI
            flag = true;
        } catch (Exception e) {
            System.out.println("ERROR: " + e.getMessage());
            flag = false;
        }

        if (doc != null && flag) {
            listaClientes = new ArrayList<Cliente>();
            List<Element> contenido = doc.getRootElement().getChildren();
            for (Element e : contenido){
                listaClientes.add(new Cliente(
                        e.getChild("Tipo").getText(),
                        e.getChild("Nombre").getText(),
                        e.getChild("Apellido").getText(),
                        e.getChild("Cedula").getText(),
                        e.getChild("Edad").getText(),
                        e.getChild("Capital").getText(),
                        leerAccionesCliente(e)));
            }
        } else {
            System.out.println("Problemas cargando el xml del cliente");
            listaClientes = null;
        }
        return listaClientes;
    }

    public synchronized void escribirCliente(List<Cliente> clientes) {
        
        if (clientes != null) {
            Element rootI = new Element("ListaPersona");
            for (Cliente c:clientes){
            Element root = new Element("Persona");
            root.addContent(new Element("Tipo").addContent(c.getTipo()));
            root.addContent(new Element("Nombre").addContent(c.getNombre()));
            root.addContent(new Element("Apellido").addContent(c.getApellido()));
            root.addContent(new Element("Cedula").addContent(c.getCedula()));
            root.addContent(new Element("Edad").addContent(c.getEdad()));
            root.addContent(new Element("Capital").addContent(c.getCapital()));
            rootI.addContent(root);
            if (c.getMisAcciones() != null)
            {
                Element root2 = new Element("StockQuotes");
                for (Accion b : c.getMisAcciones()) {
                    Element accion = new Element("Stock");
                    accion.addContent(new Element("Symbol").addContent(b.getSymbol()));
                    accion.addContent(new Element("Last").addContent(b.getLast()));
                    accion.addContent(new Element("Date").addContent(b.getDate()));
                    accion.addContent(new Element("Time").addContent(b.getTime()));
                    accion.addContent(new Element("Name").addContent(b.getName()));
                    accion.addContent(new Element("Cantidad").addContent(b.getCantidad()));
                    rootI.addContent(accion);
                    rootI.addContent(root2);
            }
            }
            else
                rootI.addContent(root);
            }
            Document docSalida = new Document(rootI);

            try {
                XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
                FileWriter writer = new FileWriter("archivos/XML/clienteNuevo.xml");
                outputter.output(docSalida, writer);
                writer.close();
            } catch (java.io.IOException e) {
                e.printStackTrace();
                System.out.println("Problema con I/O al escribir el xml");
            } catch (Exception e) {
                System.out.println("Problema al escribir el xml");
            }
        } else {
            System.out.println("No se puede persistir una lista de clientes vacia");
        }
    }
    
    public synchronized void escribirAcciones(List<Accion> acciones) {
        if (acciones != null) {
            Element root = new Element("StockQuotes");
            for (Accion b:acciones) {
                Element accion = new Element("Stock");
                accion.addContent(new Element("Symbol").addContent(b.getSymbol()));
                accion.addContent(new Element("Last").addContent(b.getLast()));
                accion.addContent(new Element("Date").addContent(b.getDate()));
                accion.addContent(new Element("Time").addContent(b.getTime()));
                accion.addContent(new Element("Name").addContent(b.getName()));
                accion.addContent(new Element("Cantidad").addContent(b.getCantidad()));
                root.addContent(accion);
            }

            Document docSalida = new Document(root);

            try {
                XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
                FileWriter writer = new FileWriter(getSalida());
                outputter.output(docSalida, writer);
                writer.close();
            } catch (java.io.IOException e) {
                e.printStackTrace();
                System.out.println("Problema con I/O al escribir el xml");
            } catch (Exception e) {
                System.out.println("Problema al escribir el xml");
            }
        } else {
            System.out.println("No se puede persistir una lista de acciones vacia");
        }
    }

    /**
     * @return the entrada
     */
    public String getEntrada() {
        return entrada;
    }

    /**
     * @param entrada the entrada to set
     */
    public void setEntrada(String entrada) {
        this.entrada = entrada;
    }

    /**
     * @return the salida
     */
    public String getSalida() {
        return salida;
    }

    /**
     * @param salida the salida to set
     */
    public void setSalida(String salida) {
        this.salida = salida;
    }

}
